﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Win32;
using System.IO;
using System.Xml.Serialization;
using Microsoft.Windows.Controls.Ribbon;
using Wpfконфигуратор.Визуализаторы;
using конфигуратор;

namespace Wpfконфигуратор
{
    /// <summary>
    /// Логика взаимодействия для Window1.xaml
    /// </summary>
    public partial class Window1
    {
        public Диспетчер Диспетчер;
        public Dictionary<object,ДинамикОбъект> СловарьРедакторов = new Dictionary<object, ДинамикОбъект>();
        bool dragStarted;

        public Window1 ()
        {
            InitializeComponent();
        }

        private void Window_Loaded ( object sender, RoutedEventArgs e )
        {   
            this.Title += " (" + Диспетчер.СвойПаспорт.Имя + ")"; 

            // отладочные объекты
            Диспетчер.ДобавитьНовыйОбъект( Диспетчер.СвойПаспорт );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт(){Имя = "пробный класс", Объект = new ПробныйКласс()});
            Диспетчер.ДобавитьНовыйОбъект(new Паспорт() {Имя = "окно", Объект = this});
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "строка", Объект = "ороргоргргр" } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "нумератор", Объект = Visibility.Hidden } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "int", Объект = 2 } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "bool", Объект = true } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "int[]", Объект = new int[]{10,20,50} } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "List<int>", Объект = new List<int>() { 10, 20, 50 } } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "List<паспорт>", Объект = new List<Паспорт>()} );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "List<стрка>", Объект = new List<string>() } );
            Диспетчер.ДобавитьНовыйОбъект( new Паспорт() { Имя = "Dictionaty<int,string>", Объект = new Dictionary<int,string>() } );
           
            ListBoxСписокОбъектов.ItemsSource = Диспетчер.Хранилище;
        }

        private void СписокОбъектов_SelectionChanged ( object sender, SelectionChangedEventArgs e )
        {

            var паспорт = (( ListBox ) sender).SelectedItem as Паспорт;
            if (паспорт != null)
            {
                if ( паспорт.Тип != null )
                    if ( СловарьРедакторов.ContainsKey( паспорт ) )
                    {
                        Редактор1.ДинОбъект = СловарьРедакторов[паспорт];
                    }
                    else
                    {
                        Редактор1.ДинОбъект = СловарьРедакторов[паспорт] = new ДинамикОбъект( паспорт );
                    }

            }
           


        }

        private void MenuItem_Click_Редактировать ( object sender, RoutedEventArgs e )
        {
            
            var паспорт = ListBoxСписокОбъектов.SelectedItem as Паспорт;
            if (паспорт != null)
            {
                var редактор = new ОкноРедакторОбъекта() {Owner = this};
                if ( СловарьРедакторов.ContainsKey( паспорт ) )
                {
                    редактор.Редактор.ДинОбъект = СловарьРедакторов[паспорт];
                }
                else
                {
                    редактор.Редактор.ДинОбъект = СловарьРедакторов[паспорт] = new ДинамикОбъект( паспорт );
                }
                 редактор.Show();
            }
           
        }

        private void MenuItem_Click_Добавить ( object sender, RoutedEventArgs e )
        {
            Диспетчер.ДобавитьНовыйОбъект(new Паспорт() {Имя = "новый объект"});
        }

      

       

       

        private void ПаспортDropHandler(object sender, DragEventArgs e)
        {
            if ( e.Data.GetDataPresent( typeof( Tuple<Type, Object> )  ) )      // 
            {
                var кортеж = (Tuple<Type, Object>) e.Data.GetData(typeof (Tuple<Type, Object>));    //Достать обьект  
                if ( кортеж.Item1 ==typeof( Паспорт) )
                {
                    var дропПас = Паспорт.ВосстановитьИзМассива((byte[]) кортеж.Item2);
                    var рез = Диспетчер.ДобавитьНовыйОбъект( дропПас); //добавить
                    e.Effects = !рез.Успешно ? DragDropEffects.None : DragDropEffects.Link;
                    if (рез.Успешно)
                    {
                        дропПас.ВосстановитьОбъект();
                    }

                    e.Handled = true;
                }
            } 
        }

        private void ListBoxItemDragMove(object sender, MouseEventArgs e) 
        { 
            if (e.LeftButton==MouseButtonState.Pressed  )
            {
                if ( dragStarted )  return;                 
                    dragStarted = true;

                    Mouse.Capture( sender as UIElement );

                    var паспорт = ListBoxСписокОбъектов.SelectedItem as Паспорт;
                    if (паспорт != null)
                    {
                        var mem = паспорт.СохранитьПаспортВМассив();
                        var кортеж= new Tuple<Type, Object>(typeof(Паспорт), mem);
                        var eff = DragDrop.DoDragDrop( ListBoxСписокОбъектов, кортеж, DragDropEffects.Copy );
                    }
            
                    Mouse.Capture(null); 
                    dragStarted = false; 
     
        } 
    }

        private void CommandBinding_Executed_Удалить ( object sender, ExecutedRoutedEventArgs e )
        {
            if ( listBoxItemНад != null )
            {
                var паспорт = listBoxItemНад.DataContext as Паспорт;
                Диспетчер.УдалитьИзХранилищаБезСохранения(паспорт);
                listBoxItemНад = null;
            }
            
        }

        private ListBoxItem listBoxItemНад;
        private void ListBoxСписокОбъектов_PreviewMouseRightButtonUp ( object sender, MouseButtonEventArgs e )
        {
             var элемент  = (DependencyObject) Mouse.DirectlyOver;
            ListBoxItem listBoxItem=null;
            while (элемент.GetType()!=typeof(ListBox))
            {
                элемент = VisualTreeHelper.GetParent( элемент );
                if  (элемент.GetType()==typeof(ListBoxItem) )
                {
                    listBoxItem = элемент as ListBoxItem;
                    break;
                }
            }
            listBoxItemНад = listBoxItem;
            
        }

        private void CommandBinding_CanExecute_Удалить ( object sender, CanExecuteRoutedEventArgs e )
        {
            e.CanExecute = listBoxItemНад != null;
        } 
} 
    
}
